﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using App.Modelo;
using App.Modelo.Interfaces;
using App.Seguridad.Vista;
using App.SolInf.Vista.Comandos;

namespace App.SolInf.Vista
{
    public class ModuloSolInf : ContenedorModulo, ISessionActual
    {
        private static volatile ModuloSolInf _instance = null;

        // para garantizar que el acceso sea sincronico y que se ejecute una sola vez 
        // by Gaston Dorigo
        private static readonly object padlock = new object();

        internal readonly FabricaControladoras FabricaControladoras
            = new FabricaControladoras();


        public static ModuloSolInf Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (padlock)
                    {
                        if (_instance == null)
                            _instance = new ModuloSolInf();
                    }
                }
                return _instance;
            }
        }

        protected ModuloSolInf()
        {
            FabricaControladoras.Session = this;
        }
        
        public IUsuario UsuarioActual { get; set; }

        public IDictionary<string, IComando> CatalogoComandos
        {
            get { return ModuloPrincipal.CatalogoComandos; }
        }

        /**
         * Cuando se inicializa se registran los comandos de este modulo en la aplicacion principal
         */
        public override void Init(IModuloPrincipal moduloPrincipal)
        {
            ModuloPrincipal = moduloPrincipal;

            // obtener la lista de comandos de la aplicacion principal
            var comandos = moduloPrincipal.CatalogoComandos;

            
            comandos.Add("Presupuestos/alta", new ComandoAltaPresupuesto());
            comandos.Add("Presupuestos/modificar", new ComandoModificarPresupuesto());
            comandos.Add("Presupuestos/baja", new ComandoBajaPresupuesto());
            comandos.Add("Presupuestos/ver", new ComandoVerPresupuesto());

            comandos.Add("Ventas/alta", new ComandoAltaVenta());


            comandos.Add("Compras/alta", new ComandoAltaCompra());
            comandos.Add("Compras/modificar", new ComandoModificarCompra());
            comandos.Add("Compras/baja", new ComandoBajaCompra());
            comandos.Add("Compras/ver", new ComandoVerCompra());

            comandos.Add("Clientes/alta", new ComandoAltaCliente());
            comandos.Add("Clientes/modificar", new ComandoModificarCliente());
            comandos.Add("Clientes/baja", new ComandoBajaCliente());
            comandos.Add("Clientes/ver", new ComandoVerCliente());

            comandos.Add("Proveedores/alta", new ComandoAltaProveedor());
            comandos.Add("Proveedores/modificar", new ComandoModificarProveedor());
            comandos.Add("Proveedores/baja", new ComandoBajaProveedor());
            comandos.Add("Proveedores/ver", new ComandoVerProveedor());

            comandos.Add("Productos/alta", new ComandoAltaProducto());
            comandos.Add("Productos/modificar", new ComandoModificarProducto());
            comandos.Add("Productos/baja", new ComandoBajaProducto());
            comandos.Add("Productos/ver", new ComandoVerProducto());

            comandos.Add("Marcas/alta", new ComandoAltaMarca());
            comandos.Add("Marcas/modificar", new ComandoModificarMarca());
            comandos.Add("Marcas/baja", new ComandoBajaMarca());
            comandos.Add("Marcas/ver", new ComandoVerMarca());

            comandos.Add("CategoriasProducto/alta", new ComandoAltaCategoriasProducto());
            comandos.Add("CategoriasProducto/modificar", new ComandoModificarCategoriasProducto());
            comandos.Add("CategoriasProducto/baja", new ComandoBajaCategoriasProducto());
            comandos.Add("CategoriasProducto/ver", new ComandoVerCategoriasProducto());

            comandos.Add("Backup/ver", new ComandoVerBackup());


        }
    }
}

